



<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  
  <title>Using key in list to check if key is contained in list &mdash; Python Anti-Patterns  documentation</title>
  

  
  

  

  
  
    

  

  
  
    <link rel="stylesheet" href="../_static/css/theme.css" type="text/css" />
  

  
    <link rel="stylesheet" href="../_static/css/ribbon.css" type="text/css" />
  
    <link rel="stylesheet" href="../_static/css/font-awesome-4.1.0/css/font-awesome.min.css" type="text/css" />
  
    <link rel="stylesheet" href="../_static/css/menu.css" type="text/css" />
  
        <link rel="index" title="Index"
              href="../genindex.html"/>
        <link rel="search" title="Search" href="../search.html"/>
    <link rel="top" title="Python Anti-Patterns  documentation" href="../index.html"/>
        <link rel="up" title="Performance" href="index.html"/>
        <link rel="next" title="Not using iteritems() to iterate over a large dictionary in Python 2" href="not_using_iteritems_to_iterate_large_dict.html"/>
        <link rel="prev" title="Performance" href="index.html"/> 

</head>

<body class="wy-body-for-nav" role="document">

  <div class="wy-grid-for-nav">

    
    <nav data-toggle="wy-nav-shift" class="wy-nav-side">
      <div class="wy-side-nav-search">
        <a href="../index.html"> Python Anti-Patterns</a>
        <div role="search">
  <form id ="rtd-search-form" class="wy-form" action="../search.html" method="get">
    <input type="text" name="q" placeholder="Search docs" />
    <input type="hidden" name="check_keywords" value="yes" />
    <input type="hidden" name="area" value="default" />
  </form>
</div>
      </div>


      <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
        
        
            <ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../correctness/index.html"><i class="fa fa-check"></i> Correctness</a></li>
<li class="toctree-l1"><a class="reference internal" href="../maintainability/index.html"><i class="fa fa-puzzle-piece"></i> Maintainability</a></li>
<li class="toctree-l1"><a class="reference internal" href="../readability/index.html"><i class="fa fa-eye"></i> Readability</a></li>
<li class="toctree-l1"><a class="reference internal" href="../security/index.html"><i class="fa fa-lock"></i> Security</a></li>
<li class="toctree-l1 current"><a class="reference internal" href="index.html"><i class="fa fa-dashboard"></i> Performance</a><ul class="current">
<li class="toctree-l2 current"><a class="current reference internal" href="#">Using <code class="docutils literal notranslate"><span class="pre">key</span> <span class="pre">in</span> <span class="pre">list</span></code> to check if key is contained in list</a></li>
<li class="toctree-l2"><a class="reference internal" href="not_using_iteritems_to_iterate_large_dict.html">Not using <code class="docutils literal notranslate"><span class="pre">iteritems()</span></code> to iterate over a large dictionary in Python 2</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../django/index.html"><i class="fa fa-book"></i> Django</a></li>
</ul>

        
      </div>
      &nbsp;

    </nav>

    <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">

      
      <nav class="wy-nav-top" role="navigation" aria-label="top navigation">
        <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
        <a href="../index.html">Python Anti-Patterns</a>
      </nav>


      
      <div class="wy-nav-content" id="signup-box" >
        <div class="rst-content">
          <div class="navigation" role="navigation" aria-label="breadcrumbs navigation">
  <ul class="wy-breadcrumbs">
    <li><a href="../index.html">Documentation</a> &raquo;</li>
      
          <li><a href="index.html"><i class="fa fa-dashboard"></i> Performance</a> &raquo;</li>
      
    <li>Using <code class="docutils literal notranslate"><span class="pre">key</span> <span class="pre">in</span> <span class="pre">list</span></code> to check if key is contained in list</li>
      <li class="wy-breadcrumbs-aside">
        
          <a href="../_sources/performance/using_key_in_list_to_check_if_key_is_contained_in_a_list.rst.txt" rel="nofollow"> View page source</a>
        
      </li>
  </ul>
  <hr/>
</div>

          <div role="main">
            
  <div class="section" id="using-key-in-list-to-check-if-key-is-contained-in-list">
<h1>Using <code class="docutils literal notranslate"><span class="pre">key</span> <span class="pre">in</span> <span class="pre">list</span></code> to check if key is contained in list<a class="headerlink" href="#using-key-in-list-to-check-if-key-is-contained-in-list" title="Permalink to this headline">¶</a></h1>
<p>Using <code class="docutils literal notranslate"><span class="pre">key</span> <span class="pre">in</span> <span class="pre">list</span></code> to iterate through a list can potentially take <code class="docutils literal notranslate"><span class="pre">n</span></code> iterations to complete, where <code class="docutils literal notranslate"><span class="pre">n</span></code> is the number of items in the list. If possible, you should change the list to a set or dictionary instead, because Python can search for items in a set or dictionary by attempting to directly accessing them without iterations, which is much more efficient.</p>
<div class="section" id="anti-pattern">
<h2>Anti-pattern<a class="headerlink" href="#anti-pattern" title="Permalink to this headline">¶</a></h2>
<p>The code below defines a list <code class="docutils literal notranslate"><span class="pre">l</span></code> and then calls <code class="docutils literal notranslate"><span class="pre">if</span> <span class="pre">3</span> <span class="pre">in</span> <span class="pre">l</span></code> to check if the number 3 exists in the list. This is inefficient. Behind the scenes, Python iterates through the list until it finds the number or reaches the end of the list.</p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">l</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">]</span>

<span class="c1"># iterates over three elements in the list</span>
<span class="k">if</span> <span class="mi">3</span> <span class="ow">in</span> <span class="n">l</span><span class="p">:</span>
    <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;The number 3 is in the list.&quot;</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
    <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;The number 3 is NOT in the list.&quot;</span><span class="p">)</span>
</pre></div>
</div>
</div>
<div class="section" id="best-practice">
<h2>Best practice<a class="headerlink" href="#best-practice" title="Permalink to this headline">¶</a></h2>
<div class="section" id="use-a-set-or-dictionary-instead-of-a-list">
<h3>Use a set or dictionary instead of a list<a class="headerlink" href="#use-a-set-or-dictionary-instead-of-a-list" title="Permalink to this headline">¶</a></h3>
<p>In the modified code below, the list has been changed to a set. This is much more efficient behind the scenes, as Python can attempt to directly access the target number in the set, rather than iterate through every item in the list and compare every item to the target number.</p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">s</span> <span class="o">=</span> <span class="nb">set</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">])</span>

<span class="k">if</span> <span class="mi">3</span> <span class="ow">in</span> <span class="n">s</span><span class="p">:</span>
    <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;The number 3 is in the list.&quot;</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
    <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;The number 3 is NOT in the list.&quot;</span><span class="p">)</span>
</pre></div>
</div>
</div>
</div>
</div>


          </div>
          <footer>
  
    <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
      
        <a href="not_using_iteritems_to_iterate_large_dict.html" class="btn btn-neutral float-right" title="Not using iteritems() to iterate over a large dictionary in Python 2"/>Next <span class="fa fa-arrow-circle-right"></span></a>
      
      
        <a href="index.html" class="btn btn-neutral" title="Performance"><span class="fa fa-arrow-circle-left"></span> Previous</a>
      
    </div>
  

  <hr/>

  <div role="contentinfo">
    <p>
    </p>
  </div>

    <!--End mc_embed_signup-->
  <a href="https://github.com/snide/sphinx_rtd_theme">Sphinx theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a> - Last updated: Sep 29, 2020 
</footer>
        </div>
      </div>

    </section>


  </div>
  


  

    <script type="text/javascript">
        var DOCUMENTATION_OPTIONS = {
            URL_ROOT:'../',
            VERSION:'',
            COLLAPSE_INDEX:false,
            FILE_SUFFIX:'.html',
            HAS_SOURCE:  true
        };
    </script>
      <script type="text/javascript" src="../_static/jquery.js"></script>
      <script type="text/javascript" src="../_static/underscore.js"></script>
      <script type="text/javascript" src="../_static/doctools.js"></script>
      <script type="text/javascript" src="../_static/language_data.js"></script>

  

  
  
    <script type="text/javascript" src="../_static/js/theme.js"></script>
  

  
  
  <script type="text/javascript">
      jQuery(function () {
          SphinxRtdTheme.StickyNav.enable();
      });
  </script>
   

  <!-- Place this tag right after the last button or just before your close body tag. -->
  <script async defer id="github-bjs" src="https://buttons.github.io/buttons.js"></script>

</body>
</html>